
# 蓝图
import io
import random

from flask import Blueprint,jsonify
from flask_restful import MethodView

# 创建蓝图：
from database import r, db

user = Blueprint('user',__name__,url_prefix='/user')


from utils import ImageCode,SendEmail,re_email,redis_db_code,send_ran_code,re_password,Md_mi


# 生成图片验证码:

# 导入返回的格式：
from flask import make_response,request

# 导入 io
import io

class ImgCodeView(MethodView):
    def get(self):
#         根据email存储：
        email = request.args.get('email',None)

        if not email:
            return jsonify({
                'msg':'邮箱未传入',
                'code':400
            })
        image = ImageCode().send_img()

#         存入到内存，使用字节流的方式不占内存：
        nei = io.BytesIO()
#         存入内存：
        image[0].save(nei,'png')
#         获取出数据：
        resp = make_response(nei.getvalue())
        # flask必要要求：
        resp.headers['Content-Type'] = 'image/png'
#         将输入以邮箱的键存入到内存中：
        r.setex(email + '_img',300,image[1])
#         返回数据：
        return resp
user.add_url_rule('/imgcode/',view_func=ImgCodeView.as_view('ImgCodeView'))




# 发送验验证码

class SendEmailView(MethodView):
    def get(self):
        email = request.args.get('email')
        img_code = request.args.get('img_code')

        if not img_code:
            return jsonify({
                'msg': '邮箱不能为空',
                'code': 400
            })

        if not email:
            return jsonify({
                'msg':'邮箱不能为空',
                'code':400
            })

#         判断邮箱的格式：
        if not re_email(email):
            return jsonify({
                'msg':'邮箱不符合要求',
                'code':400
            })

#         判断发送验证码不能超过三次，超过三次就不能发送了：
        email_count = r.get(email + "_count")

        if email_count and int(email_count) == 3:
            return jsonify({
                'msg':'以上线，不能在发送了',
                'code':400
            })

#         生成随机验证码：
        code = send_ran_code()

        img_codel= ImageCode.static_img(email,img_code)
        print('>>>>>>>>>>>>',img_codel)
        #
        if not img_codel:
            return jsonify({
                'msg':'图片验证码有误！',
                'code':400
            })

#         生成邮箱验证码：
        try:
            if not r.exists(email):
                SendEmail().send_email(email,'来自社交平台',code)
            else:
                time = r.ttl(email)
                print(">>>>>>>>>>>>>>>>",time)

                return jsonify({
                    'msg':'您已经发送了验证码，请在%s后再次发送验证码'% time,
                    'code':400
                })

        except Exception as e:
            print('>>>>>>>>>>>>>>>>>>>>>>>',e)
            return jsonify({
                'msg':'您输入的邮箱不存在！',
                'code':400
            })

#         添加到数据库中：
        resp = redis_db_code(email,code,300)

        if resp:
            #判断验证码的键是否存在，如果不存在就添加上另外一个键，如果存在就累计+1：
            if not r.exists(email + "_count"):
                r.set(email + "_count",'1')
            else:
                r.incr(email + "_count")

            return jsonify({
                'msg':'发送验证码成功',
                'code':'200'
            })
        else:
            return jsonify({
                'msg':'发送验证码失败！',
                'code':400
            })


user.add_url_rule('/sendcode/',view_func=SendEmailView.as_view("SendEmailView"))






from withdatabase import Session
from utils import JwT
# 注册试图：
class RegiView(MethodView):

    # 登录：
    def get(self):
        email = request.args.get('email')
        password = request.args.get('password')

        if not all([email,password]):
            return jsonify({
                'msg':'数据未传入',
                'code':400
            })

    #     根据邮箱和密码来获取对应的数据：
        _sql = "select `id`,`password` from `user` where `email` = '{}'and `password` = '{}' ".format(
            email,Md_mi(password)
        )

        # user = db.session.execute(_sql).fetchone()
    #     进行执行语句：
        with Session() as db:
            user = db.execute(_sql).fetchone()

        if not user:
            return jsonify({
                'msg':'用户或密码错误！',
                'code':400
            })
        else:
            userinfo = {
                'id':user[0],
                'email':user[1]
            }
        #     生成token，进行返回：
            toekn = JwT().encode_time(userinfo)

            return jsonify({
                'msg':'登录成功',
                'code':200,
                'token':toekn
            })

    def post(self):
#         接收参数
        email = request.form.get('email')
        password = request.form.get('password')
        code = request.form.get('code')

#         判断参数不能为空：
        if not all([email,password,code]):
            return jsonify({
                'msg':'参数不齐全！',
                'code':400
            })
#         判断密码格式：
        if not re_password(password):
            return jsonify({
                'msg':'密码格式不正确！',
                'code':400
            })


#         进行注册：
        try:
            # 判断图片验证码是否正确：
            pwd = Md_mi(password)
            _sql = "insert into `user` (`email`,`password`) values ('{}','{}')".format(
                email,pwd
            )
            db.session.execute(_sql)
            return jsonify({
                'msg':'注册成功',
                'code':200
            })
        except Exception as e:
            print(e)
            return jsonify({
                'msg':'该用户已存在！',
                'code':400
            })

user.add_url_rule('/regi/',view_func=RegiView.as_view("RegiView"))


# 生成图片验证码：
from PIL import Image,ImageDraw
# 导入返回：
from flask import make_response
# 导入io文件流要用的库：
import io

from utils import TuPian
class ImageView(MethodView):
    def get(self):
        email = request.args.get('email')

        if not email:
            return jsonify({
                'msg':'未传邮箱',
                'code':400
            })

        image = TuPian().sendimg()
#         存入到内存，以文件流的方式：
        nei = io.BytesIO()
#         存入：
        image[0].save(nei,'png')
#         获取出数据：
        resp = make_response(nei.getvalue())
#         flask中必要的：
        resp.headers['Content-Type'] = 'image/png'
#         存入redis：
        r.setex(email + '_img',300,image[1])

#         写入文件：
        with open('./code.png','wb') as f:
            image[0].save(f)
#         返回数据：
        return resp

user.add_url_rule('/imagecode/',view_func=ImageView.as_view("ImageView"))

















































